﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestionaleLib.Controller;
using GestionaleLib;

namespace Leaf.View.Vendita
{
    public partial class frmVenditaAlBanco : Form
    {

        private frmVenditaAlBanco RifElencoVendite;
        private FormStatus.StatoForm StatoForm;

        string Id;
        string DescDoc;
        double Imponibile;
        double RisultatoImponibile;
        double RisultatoImposta;
        string Prezzo;
        int Qta;
        int IVA;

        GestionaleLib.Controller.ctrlCalcoloVendita CalcoloImponibile = new ctrlCalcoloVendita();

        GestionaleLib.Controller.ctrlMagazzino VerificaDisponibilta = new ctrlMagazzino();
        GestionaleLib.Magazzino Magazzino =  new GestionaleLib.Magazzino();

        GestionaleLib.Controller.ctrlTipoPagamenti TipoPag = new ctrlTipoPagamenti();
        GestionaleLib.Controller.ctrlTipoDocumenti DocTipo = new ctrlTipoDocumenti();
        GestionaleLib.Controller.ctrlDocumenti Documenti = new ctrlDocumenti();
        GestionaleLib.Controller.ctrlProtocolli ctrlProtocollo = new ctrlProtocolli();

        //GestionaleLib.TipoPagamento Pagamento = new GestionaleLib.TipoPagamento();
       


        //private Prodotto Prodotto;
        private ctrlMagazzino.Causale Causale;
        Prodotto Prod = new Prodotto();

        Documento DocumentoTestata = new Documento();
        DocumentoDettaglio DocumentoDettagli = new DocumentoDettaglio();
        DocumentoPiede DocPiede = new DocumentoPiede();
        List<DocumentoDettaglio> ListaRitorno = new List<DocumentoDettaglio>();
        

        public frmVenditaAlBanco(FormStatus.StatoForm StatoForm = FormStatus.StatoForm.Nuovo)
        {
            InitializeComponent();
            CaricaCombo();
            this.StatoForm = StatoForm;
            ImpostaStato();

        }

        private void ImpostaStato()
        {
            switch (StatoForm)
            {
                case FormStatus.StatoForm.Nuovo:
                    this.Text = "Nuova Vendita";
                    break;
                case FormStatus.StatoForm.Modifica:
                    this.Text = "Modifica Vendita";
                    //LeggiCampiModifica();
                    break;
            }
        }

        private void AbilitaControlli(bool stato)
        {
            switch (stato)
            {
                case true:
                    cmdScarica.Enabled = true;
                    cmdConferma.Enabled = true;
                    break;
                case false:
                    cmdScarica.Enabled = false;
                    cmdConferma.Enabled = false;
                    break;
            }
        }




        private bool VerificaLista()
        {
            string Id;
            
            if (Grid.Rows.Count > 0)
            {
                for (int i = 0; i < Grid.Rows.Count; i++)
                {
                    Id = Grid.Rows[i].Cells["Codice"].Value.ToString();
                    if (Id == txtBarcode.Text)
                    {
                        return true;
                        break;
                    }
                }
            }
            return false;
        }

        private void EffettuaCalcoli()
        {

            if (Grid.Rows.Count > 0)
            {
                cmdConferma.Enabled = true;
                for (int i = 0; i < Grid.Rows.Count; i++)
                {
                    Id = Grid.Rows[i].Cells["Codice"].Value.ToString();
                    if (Id == txtBarcode.Text)
                    {
                        Prezzo = (Grid.Rows[i].Cells["Prezzo"].Value.ToString());
                        if (Prezzo != "")
                        {
                            Imponibile = Convert.ToSingle(String.Format("{0:F2}", Prezzo));
                        }
                        else
                        {
                            Imponibile = 0;
                        }

                        Qta = Convert.ToInt32(Grid.Rows[i].Cells["Qta"].Value.ToString());
                        if (Qta == 0)
                        {
                            Qta = 1;
                        }

                        IVA = Convert.ToInt32(Grid.Rows[i].Cells["IVA"].Value.ToString());

                        RisultatoImponibile = Convert.ToDouble(CalcoloImponibile.CalcoloImponibile(Imponibile, Qta));

                        txtImponibile.Text = String.Format("{0:F2}", RisultatoImponibile.ToString());

                        RisultatoImposta = Convert.ToDouble(CalcoloImponibile.CalcolaImposta(IVA, Imponibile));
                        txtImposta.Text = String.Format("{0:F2}", RisultatoImposta.ToString());

                        txtTotPag.Text = (RisultatoImponibile + RisultatoImposta).ToString();
                    }
                }

                DocPiede.IdDocumentoTestata = DocumentoTestata.Id;
                DocPiede.TotaleImponibile = RisultatoImponibile;
                DocPiede.TotaleImposta = RisultatoImposta;
                DocPiede.TotaleDaPagare = RisultatoImponibile + RisultatoImposta;
            }

        }

        private void VerificaScarico()
        {
            int Giorni;
            string DescPag;
            bool InsertDocTestata;
            Guid IdProdotto;
           
            GestionaleLib.Aliquota Aliquota = new GestionaleLib.Aliquota();

            GestionaleLib.TipoPagamento Pagamento = new GestionaleLib.TipoPagamento();
            GestionaleLib.TipoDocumento TipoDoc = new GestionaleLib.TipoDocumento();
            GestionaleLib.Protocollo Protocolli = new GestionaleLib.Protocollo();
            GestionaleLib.Prodotto Prodotto = new GestionaleLib.Prodotto();

            Prodotto ListaProdotti = new ctrlProdotti().SelezionaProdottiVendita(txtBarcode.Text);

            List<GestionaleLib.TipoPagamento> ListaTipoPag = new ctrlTipoPagamenti().Seleziona();
            List<GestionaleLib.TipoDocumento> ListaTipoDoc = new ctrlTipoDocumenti().Seleziona(cmbDocumenti.Text);

            foreach (GestionaleLib.TipoDocumento item in ListaTipoDoc)
            {
                DescDoc = item.Descrizione;
            }

            InsertDocTestata = false;
            foreach (GestionaleLib.TipoPagamento item in ListaTipoPag)
            {
                if (ctrlProtocollo.Seleziona(DescDoc, Protocolli) != true)
                {


                    Protocolli.Nome = DescDoc;
                    Protocolli.Progressivo = 1;
                    Protocolli.DataAggiornamento = DateTime.Now;


                    DocumentoTestata.IDProtocollo = Protocolli.Id;

                    if (ctrlProtocollo.Nuovo(Protocolli) != ctrlProtocolli.Insert.Successo)
                    {
                        MessageBox.Show("Impossibile generare un protocollo.", "Errore Generazione Protocolli.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                }
                else
                {
                    DocumentoTestata.IDProtocollo = Protocolli.Id;
                }

                DescPag = ((GestionaleLib.TipoPagamento)item).Descrizione;
                if (DescPag == cmbModPagamento.Text)
                {
                    Giorni = ((GestionaleLib.TipoPagamento)item).Giorni;

                    Pagamento.Id = ((GestionaleLib.TipoPagamento)item).Id;
                    Pagamento.Descrizione = ((GestionaleLib.TipoPagamento)item).Descrizione;
                    Pagamento.Giorni = ((GestionaleLib.TipoPagamento)item).Giorni;

                    DocumentoTestata.DataScadenza = DateTime.Now.AddDays(Giorni);
                    DocumentoTestata.Pagamento = Pagamento;
                }


                DocumentoTestata.ProgressivoDoc = Protocolli.Progressivo;
                DocumentoTestata.TipoDoc = DescDoc;
            }

            DocumentoTestata.DataEmissione = DateTime.Now;
            DocumentoTestata.AnnoEsercizio = DateTime.Now.Year;
            //DocumentoTestata.Dettagli = ListaRitorno;
            

            //Faccio lo scarico del magazzino e salvo il documento
            Causale = ctrlMagazzino.Causale.SC;
            //string Id;

            if (Grid.Rows.Count > 0)
            {
                for (int i = 0; i < Grid.Rows.Count; i++)
                {
                    GestionaleLib.Magazzino MovimentoMagazzino = new GestionaleLib.Magazzino();
                    ListaProdotti = new ctrlProdotti().SelezionaProdottiVendita(Grid.Rows[i].Cells["Codice"].Value.ToString());

                    IdProdotto = ListaProdotti.Id;

                    MovimentoMagazzino.Causale = Causale.ToString();
                    MovimentoMagazzino.Data = DateTime.Now;
                    MovimentoMagazzino.Quantita = Convert.ToInt16(Grid.Rows[i].Cells["Qta"].Value.ToString());
                    //MovimentoMagazzino.Prodotto = ListaProdotti;

                    Aliquota.Valore = Convert.ToInt32(Grid.Rows[i].Cells["IVA"].Value.ToString());

                    ListaProdotti.Codice = Grid.Rows[i].Cells["Codice"].Value.ToString();
                    ListaProdotti.Descrizione = Grid.Rows[i].Cells["Descrizione"].Value.ToString();
                    ListaProdotti.Aliquota = Aliquota;
                    ListaProdotti.Prezzo = Convert.ToInt32(Grid.Rows[i].Cells["Prezzo"].Value.ToString());

                    MovimentoMagazzino.Prodotto = ListaProdotti;

                    DocumentoDettagli.IdDocumentoTestata = DocumentoTestata.Id;
                    
                    DocumentoDettagli.Quantita = Convert.ToInt32(Grid.Rows[i].Cells["Qta"].Value.ToString());
                    if(Grid.Rows[i].Cells["Sconto"].Value.ToString() != "")
                    {
                        DocumentoDettagli.Sconto = Convert.ToInt32(Grid.Rows[i].Cells["Sconto"].Value.ToString());
                    }
                    else
                    {
                        DocumentoDettagli.Sconto = 0;
                    }

                    DocumentoDettagli.Prodotto = ListaProdotti;
                    DocumentoDettagli.Piede = DocPiede;
  
                    ListaRitorno.Add(DocumentoDettagli);
                    if (Causale == ctrlMagazzino.Causale.SC)
                    {
                        if (new ctrlMagazzino().Scarica(MovimentoMagazzino) == ctrlMagazzino.Insert.NonScaricabile)
                        {
                            MessageBox.Show("Hai cercato di scaricare più prodotti della quantità che hai in magazzino per il prodotto " + Prod.Codice + " " + Prod.Descrizione + ".", "Errore Scarico prodotto", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return;
                        }
                        else
                        {

                            AbilitaControlli(false);
                            if (Documenti.VerificaProtocolloDocumento(DocumentoTestata) > 0)
                            {
                                if (InsertDocTestata != true)
                                {
                                    if (Documenti.InsertDocumentoTestata(DocumentoTestata));
                                    {
                                        InsertDocTestata = true;
                                        Documenti.InsertNuovoDocumentoCorpo(DocumentoDettagli);
                                        Documenti.InsertNuovoDocumentoPiede(DocPiede);
                                    }
                                }
                                else
                                {
                                    Documenti.InsertNuovoDocumentoCorpo(DocumentoDettagli);
                                    Documenti.InsertNuovoDocumentoPiede(DocPiede);
                                    
                                }
                            }
                            //MessageBox.Show("Vendita completata. Attendere stampa ricevuta", "Vendita Completata", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }

                }
            }
        }

        private void CaricaInLista()
        {
            string Barcode;
            string Prodotto;
            string Qta;
            string Prezzo;
            string Iva;
            string sconto;

            if (VerificaLista() != true)
            {
                Barcode = txtBarcode.Text;
                Prodotto = txtProdotto.Text;
                Qta = txtQta.Text;
                Prezzo = (String.Format("{0:C}", txtPrezzo.Text));
                Iva = txtIva.Text;
                sconto = txtSconto.Text;

                if (Qta == "")
                {
                    Qta = "1";
                    txtQta.Text = Qta;
                }

                if (Prezzo == "")
                {

                    Prezzo = "0,00";
                    txtPrezzo.Text = Prezzo;
                }


                Grid.ColumnCount = 6;
                Grid.Columns[0].Name = "Codice";
                Grid.Columns[1].Name = "Descrizione";
                Grid.Columns[2].Name = "Qta";
                Grid.Columns[3].Name = "Prezzo";
                Grid.Columns[4].Name = "IVA";
                Grid.Columns[5].Name = "Sconto";

                string[] row = new string[] { Barcode, Prodotto, Qta, Prezzo, Iva, sconto };
                Grid.Rows.Add(row);

                EffettuaCalcoli();
  
            }
            else
            {
                MessageBox.Show("Articolo già inserito nella distinta di acquisto.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }

        }

        private void CaricaCombo()
        {
            List<GestionaleLib.TipoDocumento> ListaDocumenti = new ctrlTipoDocumenti().Seleziona();
            List<GestionaleLib.TipoPagamento> ListaModPagamenti = new ctrlTipoPagamenti().Seleziona();

            //Carico i tipi documenti
            if (ListaDocumenti != null)
            {
                foreach (GestionaleLib.TipoDocumento item in ListaDocumenti)
                {

                    if (item.Vendita)
                    {
                        cmbDocumenti.Items.Add(item.Descrizione.ToString());
                    }
                }
            }
            cmbDocumenti.SelectedIndex = -1;

            //Carico le modalità di pagamento
            if (ListaModPagamenti != null)
            {
                foreach (GestionaleLib.TipoPagamento item in ListaModPagamenti)
                {
                    
                    cmbModPagamento.Items.Add(item.Descrizione.ToString());
                }
            }
            cmbModPagamento.SelectedIndex = -1;
        }


        private void cmdCerca_Click(object sender, EventArgs e)
        {
            Prodotto ListaProdotti = new ctrlProdotti().SelezionaProdottiVendita(txtBarcode.Text);
            if (ListaProdotti != null)
            {
                int Giacenza = new ctrlMagazzino().Disponibilita(ListaProdotti);
            }

            if (txtBarcode.Text != "")
            {
                if (ListaProdotti != null)
                {
                    AbilitaControlli(true);

                    txtProdotto.Text = ListaProdotti.Descrizione.ToString();
                    txtPrezzo.Text = ListaProdotti.Prezzo.ToString();
                    txtIva.Text = ListaProdotti.Aliquota.Valore.ToString();
                }
                else
                {
                    AbilitaControlli(false);
                    txtProdotto.Text = "";
                    txtPrezzo.Text = "";
                    txtIva.Text = "";
                    MessageBox.Show("Nessun articolo trovato.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Question);
                }
            }
            else
            {
                MessageBox.Show("Non è possibile effettuare la ricerca in quanto il campo codice è vuoto. Inserire il codice di un articolo per continuare.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Question);
            }
        }

        private void cmdScarica_Click(object sender, EventArgs e)
        {
            VerificaLista();
            CaricaInLista();
        }

        private void cmdConferma_Click(object sender, EventArgs e)
        {
          VerificaScarico();
          
        }

        private void cmdStampa_Click(object sender, EventArgs e)
        {
            ctrlStampe Stampa = new ctrlStampe();
            if (Stampa.Connessione())
            {
                MessageBox.Show("OK");
            }
        }

    }
}
